package com.itheima.reggie.service.impl;

import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.UserHolder;
import com.itheima.reggie.domain.Cart;
import com.itheima.reggie.mapper.CartMapper;
import com.itheima.reggie.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;


// 购物车
@Service
@Transactional
public class CartServiceImpl implements CartService {

    //依赖注入mapper层
    @Autowired
    private CartMapper cartMapper;

    //添加购物车
    @Override
    public Cart save(Cart cartParam) {
        //业务处理
        //1.先查询购物车内的信息
        //1-1创建条件构造器
        LambdaQueryWrapper<Cart> qw = new LambdaQueryWrapper<>();
        //1-2设置条件
        qw.eq(Cart::getUserId, UserHolder.get().getId());    //用户id
        qw.eq(cartParam.getDishId() != null, Cart::getDishId, cartParam.getDishId());   //菜品id
        qw.eq(cartParam.getSetmealId() != null, Cart::getSetmealId, cartParam.getSetmealId());  //套餐id
        //1-3调用mp查询
        Cart cart = cartMapper.selectOne(qw);

        // 判断
        if (cart == null) {       //2.不存在,新增
            //若空,补全信息
            cart = cartParam;
            //2-1添加id信息 雪花算法的id生成器
            cart.setId(IdUtil.getSnowflake(1, 1).nextId());
            //2-2添加用户id信息 ThreadLocal
            cart.setUserId(UserHolder.get().getId());
            //2-3新建创建时间
            cart.setCreateTime(new Date());
            //2-4补全数量
            cart.setNumber(1);
            //2-5调用mp添加到购物车表
            cartMapper.insert(cart);
        } else {             //3.存在,更新数据库
            //若不空
            //3-1将number自增
            cart.setNumber(cart.getNumber() + 1);
            //3-2更新数据库
            cartMapper.updateById(cart);
        }
        //4.返回购物车数据
        return cart;
    }

    ////查看购物车
    @Override
    public List<Cart> findList() {
        //业务处理
        //调用mp根据用户id查询
        return cartMapper.selectList(new LambdaQueryWrapper<Cart>().eq(Cart::getUserId, UserHolder.get().getId()));
    }

    //修改购物车
    @Override
    public Cart updateByCommoditId(Long setmealId, Long dishId) {
        //业务处理
        //1.根据id查询购物车表
        //1-1创建条件构造器
        LambdaQueryWrapper<Cart> qw = new LambdaQueryWrapper<>();
        //1-2设置条件   //判断查询的是setmealId还是dishId
        qw.eq(Cart::getUserId, UserHolder.get().getId());
        qw.eq(setmealId != null, Cart::getSetmealId, setmealId);
        qw.eq(dishId != null, Cart::getDishId, dishId);
        //1-3调用mp查询
        Cart cart = cartMapper.selectOne(qw);
        //2.将cart记录中的number-1
        cart.setNumber(cart.getNumber() - 1);
        //3.将新数据更新到购物车表中
        //3-1 判断此时number是否大于零
        if (cart.getNumber() == 0) {
            //调用删除方法
            cartMapper.deleteById(cart);
        } else {
            //3-2若!=0,则调用更新方法
            cartMapper.updateById(cart);
        }
        //4.返回购物车对象
        return cart;
    }

    ////清空购物车
    @Override
    public void clean() {
        //业务处理
        //根据userid清空购物车表内数据
        cartMapper.delete(new LambdaQueryWrapper<Cart>().eq(Cart::getUserId, UserHolder.get().getId()));
    }
}
